package com.unbook.service.impl;

import com.unbook.enums.EVerifyState;
import com.unbook.service.IVerifyService;
import com.unbook.utils.VerifyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Service;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.concurrent.TimeUnit;
@Service
public class VerifyServiceImpl implements IVerifyService {
    @Autowired
    private RedisTemplate<String,String> redisTemplate;
    @Override
    public String getCode(String id) throws IOException {
        // 利用图片工具生成图片
        // 返回的数组第一个参数是生成的验证码，第二个参数是生成的图片
        Object[] objs = VerifyUtil.newBuilder()
            .setWidth(120)   //设置图片的宽度
            .setHeight(35)   //设置图片的高度
            .setSize(4)      //设置字符的个数
            .setLines(5)    //设置干扰线的条数
            .setFontSize(25) //设置字体的大小
            .setTilt(true)   //设置是否需要倾斜
            .setBackgroundColor(Color.LIGHT_GRAY) //设置验证码的背景颜色
            .build()         //构建VerifyUtil项目
            .createImage();  //生成图片
        // 打印验证码
        System.out.println(objs[0]);

        // 设置redis值的序列化方式
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        // 将验证码存入redis
        redisTemplate.opsForValue().set(("VERIFY_CODE_" + id), objs[0].toString(), 5 * 60, TimeUnit.SECONDS);
        // 将图片输出给浏览器
        BufferedImage image = (BufferedImage) objs[1];
        ByteArrayOutputStream baos = new ByteArrayOutputStream();//io流
        ImageIO.write(image, "png", baos);//写入流中
        byte[] bytes = baos.toByteArray();//转换成字节
        Base64.Encoder encoder = Base64.getEncoder();
        String png_base64 =  encoder.encodeToString(bytes).trim();//转换成base64串
        png_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n
        return png_base64;
    }

    @Override
    public EVerifyState checkCode(String sessionId, String code) {
        // 将redis中的尝试次数减一
        String verifyCodeKey = "VERIFY_CODE_" + sessionId;
        String cacheCode = redisTemplate.opsForValue().get(verifyCodeKey);
        if(cacheCode == null){
            return EVerifyState.LOSE;
        }
        if(!code.equalsIgnoreCase(cacheCode)){
            return EVerifyState.MISTAKE;
        }
        // 验证通过之后手动将验证码失效
        redisTemplate.delete(verifyCodeKey);
        return EVerifyState.OK;
    }
}
